package com.example.service.impl;

import com.example.model.Product;
import com.example.repository.mongo.ProductMongoRepo;
import com.example.service.ProductService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Optional;

/**
 * 商品服务实现类
 * 仅操作MongoDB
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class ProductServiceImpl implements ProductService {
    
    private final ProductMongoRepo mongoRepository;
    
    /**
     * 保存商品信息
     */
    @Override
    public Product saveProduct(Product product) {
        log.info("保存商品信息: {}", product.getProductName());
        
        Product savedProduct = mongoRepository.save(product);
        log.info("商品信息已保存到MongoDB: {}", savedProduct.getId());
        
        return savedProduct;
    }
    
    /**
     * 根据ID查找商品
     */
    @Override
    public Optional<Product> findById(String id) {
        log.info("根据ID查找商品: {}", id);
        
        Optional<Product> product = mongoRepository.findById(id);
        if (product.isPresent()) {
            log.info("找到商品: {}", product.get().getProductName());
        }
        
        return product;
    }
    
    /**
     * 获取所有商品（分页）
     */
    @Override
    public Page<Product> findAllProducts(Pageable pageable) {
        log.info("获取所有商品，页码: {}, 大小: {}", pageable.getPageNumber(), pageable.getPageSize());
        return mongoRepository.findAll(pageable);
    }
    
    /**
     * 根据商品名称查找商品
     */
    @Override
    public List<Product> findByProductName(String productName) {
        log.info("根据商品名称查找商品: {}", productName);
        return mongoRepository.findByProductName(productName);
    }
    
    /**
     * 根据商品编号查找商品
     */
    @Override
    public Product findByProductCode(String productCode) {
        log.info("根据商品编号查找商品: {}", productCode);
        return mongoRepository.findByProductCode(productCode);
    }
    
    /**
     * 根据价格范围查找商品
     */
    @Override
    public List<Product> findByPriceRange(double minPrice, double maxPrice) {
        log.info("根据价格范围查找商品: {} - {}", minPrice, maxPrice);
        return mongoRepository.findByPriceBetween(minPrice, maxPrice);
    }
    
    /**
     * 根据生产日期范围查找商品
     */
    @Override
    public List<Product> findByProductionDateRange(Date startDate, Date endDate) {
        log.info("根据生产日期范围查找商品: {} - {}", startDate, endDate);
        return mongoRepository.findByProductionDateBetween(startDate, endDate);
    }
    
    /**
     * 根据生产厂家查找商品
     */
    @Override
    public List<Product> findByManufacturer(String manufacturer) {
        log.info("根据生产厂家查找商品: {}", manufacturer);
        return mongoRepository.findByManufacturer(manufacturer);
    }
    
    /**
     * 更新商品信息
     */
    @Override
    public Product updateProduct(Product product) {
        log.info("更新商品信息: {}", product.getId());
        
        Product updatedProduct = mongoRepository.save(product);
        
        log.info("商品信息更新完成: {}", product.getProductName());
        return updatedProduct;
    }
    
    /**
     * 删除商品信息
     */
    @Override
    public void deleteProduct(String id) {
        log.info("删除商品信息: {}", id);
        
        mongoRepository.deleteById(id);
        log.info("已删除商品: {}", id);
    }
    
    /**
     * 统计商品总数
     */
    @Override
    public long countProducts() {
        return mongoRepository.count();
    }
}